import re

from rest_framework import serializers

from areas.models import Area


# 省的序列化器
from users.models import Address


class AreaSerializer(serializers.ModelSerializer):

    class Meta:
        model = Area
        fields = ('id', 'name')


# 城市的序列化器
class SubAreaSerializer(serializers.ModelSerializer):
    '''子行政区划信息序列化器 '''

    subs = AreaSerializer(many=True, read_only=True)

    class Meta:
        model = Area
        fields = ('id', 'name', 'subs') # Area模型类中中 related_name 的值


# 用户地址的序列化器
class UserAddressSerializer(serializers.ModelSerializer):
    '''
    用户地址的序列化器： 序列化 + 校验参数

    '''

    # 将省市区添加到序列化器中后续进行序列化
    province = serializers.StringRelatedField(read_only=True)  # 默认返回关联对象的主键
    city = serializers.StringRelatedField(read_only=True)
    district = serializers.StringRelatedField(read_only=True)

    # 新增地址时补充的字段
    province_id = serializers.IntegerField(label='省ID', required=True)
    city_id = serializers.IntegerField(label='市ID', required=True)
    district_id = serializers.IntegerField(label='区ID', required=True)


    # 校验手机号
    def validate_mobile(self, value):
        if not re.match(r'^1[3-9]\d{9}$', value):
            raise serializers.ValidationError('手机号格式错误')
        return value

    # 重写create方法  将数据写入数据库中
    def create(self, validated_data):
        ''' 保存'''
        # 补充一个字段 ： 收货地址所属用户， 在保存在数据库中

        # 获取当前登陆用户的对象
        validated_data['user'] = self.context['request'].user

        print('self.context', self.context)
        return super().create(validated_data)

    class Meta:
        model = Address
        # 新增地址，不需要用户传递user到服务器，服务器可以自动获取到当前登录用户对象
        exclude = ('user', 'is_deleted', 'create_time', 'update_time')